home *** CD-ROM | disk | FTP | other *** search
- /*
- * Code extracted from
- * linux/kernel/hd.c
- *
- * Copyright (C) 1991, 1992 Linus Torvalds
- */
-
- /*
- * Thanks to Branko Lankester, lankeste@fwi.uva.nl, who found a bug
- * in the early extended-partition checks and added DM partitions
- */
-
- #include <linux/config.h>
- #include <linux/fs.h>
- #include <linux/genhd.h>
- #include <linux/kernel.h>
-
- struct gendisk *gendisk_head = NULL;
-
- int current_minor = 0;
- extern int *blk_size[];
- extern void rd_load(void);
- extern int ramdisk_size;
-
- static void check_partition(struct gendisk *hd, unsigned int dev)
- {
- static int first_time = 1;
-
- if (first_time)
- printk("Partition check:\n");
- first_time = 0;
-
- mach_check_partition (hd, dev);
- }
-
- /* This function is used to re-read partition tables for removable disks.
- Much of the cleanup from the old partition tables should have already been
- done */
-
- /* This function will re-read the partition tables for a given device,
- and set things back up again. There are some important caveats,
- however. You must ensure that no one is using the device, and no one
- can start using the device while this function is being executed. */
-
- void resetup_one_dev(struct gendisk *dev, int drive)
- {
- int i;
- int start = drive<<dev->minor_shift;
- int j = start + dev->max_p;
- int major = dev->major << 8;
-
- current_minor = 1+(drive<<dev->minor_shift);
- check_partition(dev, major+(drive<<dev->minor_shift));
-
- for (i=start ; i < j ; i++)
- dev->sizes[i] = dev->part[i].nr_sects >> (BLOCK_SIZE_BITS - 9);
- }
-
- static void setup_dev(struct gendisk *dev)
- {
- int i;
- int j = dev->max_nr * dev->max_p;
- int major = dev->major << 8;
- int drive;
-
-
- for (i = 0 ; i < j; i++) {
- dev->part[i].start_sect = 0;
- dev->part[i].nr_sects = 0;
- }
- dev->init();
- for (drive=0 ; drive<dev->nr_real ; drive++) {
- current_minor = 1+(drive<<dev->minor_shift);
- check_partition(dev, major+(drive<<dev->minor_shift));
- }
- for (i=0 ; i < j ; i++)
- dev->sizes[i] = dev->part[i].nr_sects >> (BLOCK_SIZE_BITS - 9);
- blk_size[dev->major] = dev->sizes;
- }
-
- /* This may be used only once, enforced by 'static int callable' */
- asmlinkage int sys_setup(void * BIOS)
- {
- static int callable = 1;
- struct gendisk *p;
- int nr=0;
-
- #ifdef DEBUG
- printk ("sys_setup: press mousebutton to continue\n");
- waitbut();
- #endif
-
- if (!callable)
- return -1;
- callable = 0;
-
- for (p = gendisk_head ; p ; p=p->next) {
- setup_dev(p);
- nr += p->nr_real;
- }
- if (ramdisk_size)
- rd_load();
-
- mount_root();
- return (0);
- }
-